Line data Source code
1 : #include "RVCController.hpp"
2 : #include "CleaningController.hpp"
3 : #include "NavigationController.hpp"
4 :
5 52 : RVCController::RVCController(NavigationController& nav, CleaningController& cleaning)
6 52 : : nav_(nav), cleaning_(cleaning), state_(State::IDLE), leftClear_(false) {}
7 :
8 26 : void RVCController::start() {
9 26 : cleaning_.startCleaning();
10 26 : nav_.moveForward();
11 26 : state_ = State::CLEANING;
12 26 : }
13 :
14 22 : void RVCController::frontObstacleDetected() {
15 22 : cleaning_.stopCleaning();
16 22 : nav_.stop();
17 22 : state_ = State::STOPPED;
18 22 : }
19 :
20 55 : void RVCController::sideStatus(Direction /*direction*/, bool clear) {
21 55 : switch (state_) {
22 : case State::STOPPED:
23 : // SD-002: sideStatus(LEFT) 수신 — rotateRight로 우측 스캔 준비
24 20 : leftClear_ = clear;
25 20 : nav_.rotateRight();
26 20 : state_ = State::STOPPED_CHECKING_RIGHT;
27 20 : break;
28 :
29 : case State::STOPPED_CHECKING_RIGHT:
30 : // SD-002: sideStatus(RIGHT) 수신 — rotateLeft로 정면 복귀 후 방향 결정
31 19 : nav_.rotateLeft();
32 19 : if (leftClear_) {
33 4 : nav_.turn(Direction::LEFT);
34 4 : cleaning_.startCleaning();
35 4 : nav_.moveForward();
36 4 : state_ = State::CLEANING;
37 19 : } else if (clear) {
38 3 : nav_.turn(Direction::RIGHT);
39 3 : cleaning_.startCleaning();
40 3 : nav_.moveForward();
41 3 : state_ = State::CLEANING;
42 3 : } else {
43 : // E1: 좌·우 모두 막힘 → UC-003
44 12 : nav_.moveBackward();
45 12 : state_ = State::REVERSING;
46 : }
47 19 : break;
48 :
49 : case State::REVERSING:
50 : // SD-003 루프: sideStatus(LEFT) 수신
51 10 : if (clear) {
52 4 : nav_.stop();
53 4 : nav_.turn(Direction::LEFT);
54 4 : nav_.moveForward();
55 4 : cleaning_.startCleaning();
56 4 : state_ = State::CLEANING;
57 4 : } else {
58 6 : nav_.rotateRight();
59 6 : state_ = State::REVERSING_CHECKING_RIGHT;
60 : }
61 10 : break;
62 :
63 : case State::REVERSING_CHECKING_RIGHT:
64 : // SD-003 루프: sideStatus(RIGHT) 수신 — rotateLeft로 정면 복귀
65 5 : nav_.rotateLeft();
66 5 : if (clear) {
67 3 : nav_.stop();
68 3 : nav_.turn(Direction::RIGHT);
69 3 : nav_.moveForward();
70 3 : cleaning_.startCleaning();
71 3 : state_ = State::CLEANING;
72 3 : } else {
73 2 : state_ = State::REVERSING;
74 : }
75 5 : break;
76 :
77 : default:
78 1 : break;
79 : }
80 55 : }
81 :
82 1 : void RVCController::dustDetected() {
83 1 : cleaning_.boostCleaning();
84 1 : }
|